home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / mig / Mig_ConfirmIdle.c < prev    next >
C/C++ Source or Header  |  1990-09-24  |  5KB  |  173 lines

  1. /* 
  2.  * Mig_ConfirmIdle.c --
  3.  *
  4.  *    Confirm that a host is available.
  5.  *
  6.  * Copyright 1988, 1990 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_ConfirmIdle.c,v 2.3 90/09/24 14:46:46 douglis Exp $ SPRITE (Berkeley)";
  18. #endif /* not lint */
  19.  
  20.  
  21. #include <stdio.h>
  22. #include <sprite.h>
  23. #include <status.h>
  24. #include <bit.h>
  25. #include <mig.h>
  26. #include <kernel/net.h>
  27. #include <sys/time.h>
  28. #include <sysStats.h>
  29. #include <host.h>
  30. #include <errno.h>
  31. #include "migInt.h"
  32.  
  33. /* 
  34.  * Keep track of whether we should get new hosts, or whether we know none
  35.  * are available.  Defaults to asking, of course.  Set to 0 if too few
  36.  * hosts are available.
  37.  */
  38. int migGetNewHosts = 1;
  39.  
  40. /*
  41.  *----------------------------------------------------------------------
  42.  *
  43.  * Mig_ConfirmIdle --
  44.  *
  45.  *    Double-check that a host is still accepting migration.  Otherwise
  46.  *    we could keep migrating to a host that is no longer idle.  We check
  47.  *    to see if the stream is selectable, in which case we get
  48.  *    any updates to host availability and modify our cache, and in any
  49.  *    case we then check the host cache.  The same logic is used to
  50.  *    check for msgs indicating a host is now available, in which
  51.  *     case a hostID  of 0 is used.
  52.  *
  53.  * Results:
  54.  *    TRUE if the host is still available (or a new host is available,
  55.  *    if hostID == 0), FALSE otherwise or if an error occurs.
  56.  *
  57.  * Side effects:
  58.  *    May do ioctl to server.
  59.  *
  60.  *----------------------------------------------------------------------
  61.  */
  62. Boolean
  63. Mig_ConfirmIdle(hostID)
  64.     int hostID;            /* ID of host to confirm availability of */
  65. {
  66.     static int *bitArray = NULL;
  67.     static int bitSize = 0;
  68.     int numReady;
  69.     int status;
  70.     int msgHostID;
  71.     struct timeval time;
  72.     int retries = 0;
  73.     
  74. #ifdef DEBUG
  75.     fprintf(stderr, "Mig_ConfirmIdle(%d) called.\n", hostID);
  76. #endif /* DEBUG */
  77.  
  78.     if (mig_GlobalPdev < 0) {
  79. #ifdef DEBUG
  80.     fprintf(stderr, "Mig_ConfirmIdle: no pdev connection.\n");
  81. #endif /* DEBUG */
  82.     return(FALSE);
  83.     }
  84.     if (bitSize <= mig_GlobalPdev) {
  85.     bitArray = Bit_Expand(mig_GlobalPdev + 1, bitSize, bitArray);
  86.     bitSize = mig_GlobalPdev + 1;
  87.     }
  88.         
  89.     while (1) {
  90.     Bit_Set(mig_GlobalPdev, bitArray);
  91.     time.tv_sec = 0;
  92.     time.tv_usec = 0;
  93. #ifdef DEBUG
  94.     fprintf(stderr, "Mig_ConfirmIdle: calling select.\n");
  95. #endif /* DEBUG */
  96.     numReady = select(bitSize, bitArray, (int *) NULL, (int *) NULL,
  97.          &time);
  98. #ifdef DEBUG
  99.     fprintf(stderr, "Mig_ConfirmIdle: select returned %d.\n", numReady);
  100. #endif /* DEBUG */
  101.     if (numReady <= 0) {
  102.         break;
  103.     } else {
  104. #ifdef DEBUG
  105.         fprintf(stderr, "Mig_ConfirmIdle: calling Fs_IOControl.\n");
  106. #endif /* DEBUG */
  107.         if (MigSetAlarm() < 0) {
  108.         fprintf(stderr,
  109.             "Error setting alarm for contact with migd.\n");
  110.         return(FALSE);
  111.         }
  112.         status = Fs_IOControl(mig_GlobalPdev, IOC_MIG_GET_UPDATE,
  113.                   0, (char *) NULL, sizeof(int),
  114.                   (char *) &msgHostID);
  115.         if (MigClearAlarm() < 0) {
  116.         fprintf(stderr,
  117.             "Error clearing alarm for contact with migd.\n");
  118.         }
  119.         
  120.         
  121. #ifdef DEBUG
  122.         fprintf(stderr, "Mig_ConfirmIdle: Fs_IOControl returned %x.\n",
  123.            status);
  124. #endif /* DEBUG */
  125.         if (status != SUCCESS) {
  126.         fprintf(stderr,
  127.                "Mig_ConfirmIdle: error during ioctl to global master: %s\n",
  128.                Stat_GetMsg(status));
  129.         if (status & 0xf0000 || status == GEN_ABORTED_BY_SIGNAL) {
  130.             /*
  131.              * fs/dev/... error, or timeout,
  132.              * rather than FAILURE or INVALID_ARG.
  133.              */
  134.             close(mig_GlobalPdev);
  135.             mig_GlobalPdev = 0;
  136.             if (retries > 0 || MigOpenPdev(TRUE) < 0) {
  137.             return(FALSE);
  138.             }
  139.             retries = 1;
  140.         } else {
  141.             return(FALSE);
  142.         }
  143.         continue;
  144.         }
  145.         if (msgHostID == 0) {
  146. #ifdef DEBUG
  147.         fprintf(stderr, "Mig_ConfirmIdle: new host(s) available.\n");
  148. #endif /* DEBUG */
  149.         migGetNewHosts = 1;
  150.         if (migCallBackPtr != NULL) {
  151.             (*migCallBackPtr)(msgHostID);
  152.         }
  153.         } else 
  154. #ifdef DEBUG
  155.         fprintf(stderr, "Mig_ConfirmIdle: host %d unavailable.\n",
  156.                msgHostID);
  157. #endif /* DEBUG */
  158.         (void) MigHostCache(msgHostID, MIG_CACHE_REMOVE, TRUE);
  159.     }
  160.     }
  161.     if (hostID == 0) {
  162. #ifdef DEBUG
  163.     fprintf(stderr, "Mig_ConfirmIdle: returning %d.\n", migGetNewHosts);
  164. #endif /* DEBUG */
  165.     return(migGetNewHosts);
  166.     }
  167. #ifdef DEBUG
  168.     fprintf(stderr, "Mig_ConfirmIdle: returning %d.\n",
  169.        MigHostCache(hostID, MIG_CACHE_VERIFY, FALSE));
  170. #endif /* DEBUG */
  171.     return(MigHostCache(hostID, MIG_CACHE_VERIFY, FALSE));
  172. }
  173.